﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Articulos;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.CotizarArticulos;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Porcentuales_Cantidades;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Rubro;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Unidad;
using CalculoPreciosUnitarios.Logica.GestorObject.Articulo;
using CalculoPreciosUnitarios.Logica.GestorObject.CotizarArticulos;
using CalculoPreciosUnitarios.Logica.GestorObject.LectorExcel;
using CalculoPreciosUnitarios.Logica.GestorObject.Porcentuales_Cantidades;
using CalculoPreciosUnitarios.Logica.GestorObject.Rubro;
using CalculoPreciosUnitarios.Logica.GestorObject.Unidad;
using Microsoft.Win32;

namespace CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.LectorExcel
{
    public class LectorExcelDB
    {
        #region Property

        RubroDB rubroDB = new RubroDB();

        #endregion

        #region Unidad

        /** arch: Ruta del archivo
         *  Hoja: Nombre de la hoja donde estan los datos en Excel
         **/

        private List<UnidadCS> LeerUnidadesDesdeExcel(string arch, string Hoja)
        {
            List<UnidadCS> resultados = new List<UnidadCS>();

            DataTable dt = LectorExcelCS.SelectExcel(arch, Hoja);

            for (int i = 0; i < dt.Rows.Count - 1; i++)
            {
                DataRow item = dt.Rows[i];
                
                if (!item[0].ToString().Equals(""))
                {
                    UnidadCS unidad = new UnidadCS();

                    unidad.IdUnidad = item[0].ToString();
                    unidad.Descripcion = item[1].ToString();

                    resultados.Add(unidad);
                }
            }

            resultados.RemoveAll(CodigosVaciosUnidad);

            return resultados;
        }

        private static bool CodigosVaciosUnidad(UnidadCS unidad)
        {
            return unidad.IdUnidad.Equals("");
        }

        public void CargarUnidadesPorExcel()
        {
            List<UnidadCS> resultados = new List<UnidadCS>();
            int resultadoConsulta = 0;

            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Excel Files(*.xlsx;*.xls)|*.xlsx;*.xls";
            openFileDialog.Title = "Seleccione archivo de Excel";

            int height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
            int width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;

            UnidadBD _unidadDB = new UnidadBD();

            if (openFileDialog.ShowDialog() == true)
            {
                string path = openFileDialog.FileName;
                string nombreHoja = Microsoft.VisualBasic.Interaction.InputBox("Ingrese el nombre de la Hoja de Excel que contiene la informacion", "Nombre Hoja", "Hoja1", width / 3, height / 3);

                if (!nombreHoja.Trim().Equals(""))
                {
                    resultados = LeerUnidadesDesdeExcel(path, nombreHoja);
                    resultadoConsulta = _unidadDB.CargarUnidades(resultados);
                    if (resultadoConsulta == 1)
                    {
                        MessageBox.Show("Datos Cargados");
                    }
                    else
                    {
                        MessageBox.Show("Hubo un error en la carga");
                    }
                }
                else
                {
                    MessageBox.Show("Nombre de Hoja no encontrado");
                }
            }
        }

        #endregion

        #region Rubro

        /** arch: Ruta del archivo
         *  Hoja: Nombre de la hoja donde estan los datos en Excel
         **/

        private List<RubroCS> LeerRubrosDesdeExcel(string arch, string Hoja)
        {
            List<RubroCS> resultados = new List<RubroCS>();

            DataTable dt = LectorExcelCS.SelectExcel(arch, Hoja);

            for (int i = 0; i < dt.Rows.Count - 1; i++)
            {
                DataRow item = dt.Rows[i];
                if (!item[0].ToString().Equals(""))
                {
                    RubroCS rubro = new RubroCS();
                    rubro.IdRubro = item[0].ToString();
                    rubro.Descripcion = item[1].ToString();

                    resultados.Add(rubro);
                }
            }

            resultados.RemoveAll(CodigosVaciosRubro);

            return resultados;
        }

        private static bool CodigosVaciosRubro(RubroCS rubro)
        {
            return rubro.IdRubro.Equals("");
        }

        public void CargarRubrosPorExcel()
        {
            List<RubroCS> resultados = new List<RubroCS>();
            int resultadoConsulta = 0;

            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Excel Files(*.xlsx;*.xls)|*.xlsx;*.xls";
            openFileDialog.Title = "Seleccione archivo de Excel";

            int height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
            int width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;

            if (openFileDialog.ShowDialog() == true)
            {
                string path = openFileDialog.FileName;
                string nombreHoja = Microsoft.VisualBasic.Interaction.InputBox("Ingrese el nombre de la Hoja de Excel que contiene la informacion", "Nombre Hoja", "Hoja1", width / 3, height / 3);

                if (!nombreHoja.Trim().Equals(""))
                {
                    resultados = LeerRubrosDesdeExcel(path, nombreHoja);
                    resultadoConsulta = rubroDB.CargarRubros(resultados);
                    if (resultadoConsulta == 1)
                    {
                        MessageBox.Show("Datos Cargados");
                    }
                    else
                    {
                        MessageBox.Show("Hubo un error en la carga");
                    }
                }
                else
                {
                    MessageBox.Show("Nombre de Hoja no encontrado");
                }
            }
        }

        #endregion

        #region SubRubro

        /** arch: Ruta del archivo
         *  Hoja: Nombre de la hoja donde estan los datos en Excel
         **/

        private List<SubRubroCS> LeerSubRubrosDesdeExcel(string arch, string Hoja)
        {
            List<SubRubroCS> resultados = new List<SubRubroCS>();

            DataTable dt = LectorExcelCS.SelectExcel(arch, Hoja);

            for (int i = 0; i < dt.Rows.Count - 1; i++)
            {
                DataRow item = dt.Rows[i];
                if (!item[0].ToString().Equals(""))
                {
                    SubRubroCS subRubro = new SubRubroCS();
                    subRubro.IdRubro = item[0].ToString();
                    subRubro.IdSubRubro = item[1].ToString();
                    subRubro.Descripcion = item[2].ToString();
                    subRubro.Precio = (item[3].ToString().Equals("")) ? 0.0m : Convert.ToDecimal(item[3].ToString());

                    resultados.Add(subRubro);
                }
            }

            resultados.RemoveAll(CodigosVaciosSubRubro);

            return resultados;
        }

        private static bool CodigosVaciosSubRubro(SubRubroCS subRubro)
        {
            return (subRubro.IdRubro.Equals("") || subRubro.IdSubRubro.Equals(""));
        }

        public void CargarSubRubrosPorExcel()
        {
            List<SubRubroCS> resultados = new List<SubRubroCS>();
            int resultadoConsulta = 0;

            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Excel Files(*.xlsx;*.xls)|*.xlsx;*.xls";
            openFileDialog.Title = "Seleccione archivo de Excel";

            int height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
            int width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;

            if (openFileDialog.ShowDialog() == true)
            {
                string path = openFileDialog.FileName;
                string nombreHoja = Microsoft.VisualBasic.Interaction.InputBox("Ingrese el nombre de la Hoja de Excel que contiene la informacion", "Nombre Hoja", "Hoja1", width / 3, height / 3);

                if (!nombreHoja.Trim().Equals(""))
                {
                    resultados = LeerSubRubrosDesdeExcel(path, nombreHoja);
                    resultadoConsulta = rubroDB.CargarSubRubros(resultados);
                    if (resultadoConsulta == 1)
                    {
                        MessageBox.Show("Datos Cargados");
                    }
                    else
                    {
                        MessageBox.Show("Hubo un error en la carga");
                    }
                }
                else
                {
                    MessageBox.Show("Nombre de Hoja no encontrado");
                }
            }
        }

        #endregion

        #region Articulos

        /** arch: Ruta del archivo
         *  Hoja: Nombre de la hoja donde estan los datos en Excel
         **/

        private List<ArticuloCS> LeerArticulosDesdeExcel(string arch, string Hoja)
        {
            List<ArticuloCS> resultados = new List<ArticuloCS>();

            DataTable dt = LectorExcelCS.SelectExcel(arch, Hoja);

            for (int i = 0; i < dt.Rows.Count - 1; i++)
            {
                DataRow item = dt.Rows[i];
                
                if (!item[0].ToString().Equals(""))
                {
                    ArticuloCS articulo = new ArticuloCS();
                    articulo.Codigo = item[0].ToString();
                    articulo.Detalle = item[1].ToString();
                    articulo.Precio = (item[2].ToString().Equals("")) ? 0.0m : Convert.ToDecimal(item[2].ToString());

                    resultados.Add(articulo);
                }
            }

            resultados.RemoveAll(CodigosVaciosArticulos);

            return resultados;
        }

        private static bool CodigosVaciosArticulos(ArticuloCS articulo)
        {
            return articulo.Codigo.Equals("");
        }

        public void CargarArticulosPorExcel()
        {
            List<ArticuloCS> resultados = new List<ArticuloCS>();
            int resultadoConsulta = 0;

            articulosDB articuloDB = new articulosDB();

            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Excel Files(*.xlsx;*.xls)|*.xlsx;*.xls";
            openFileDialog.Title = "Seleccione archivo de Excel";

            int height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
            int width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;

            if (openFileDialog.ShowDialog() == true)
            {
                string path = openFileDialog.FileName;
                string nombreHoja = Microsoft.VisualBasic.Interaction.InputBox("Ingrese el nombre de la Hoja de Excel que contiene la informacion", "Nombre Hoja", "Hoja1", width / 3, height / 3);

                if (!nombreHoja.Trim().Equals(""))
                {
                    resultados = LeerArticulosDesdeExcel(path, nombreHoja);
                    resultadoConsulta = articuloDB.CargarArticulos(resultados);

                    if (resultadoConsulta == 1)
                    {
                        MessageBox.Show("Datos Cargados");
                    }
                    else
                    {
                        MessageBox.Show("Hubo un error en la carga");
                    }
                }
                else
                {
                    MessageBox.Show("Nombre de Hoja no encontrado");
                }
            }
        }

        #endregion

        #region Porcentuales y Cantidades

        /** arch: Ruta del archivo
         *  Hoja: Nombre de la hoja donde estan los datos en Excel
         **/

        private List<CargaPorcentualesCantidadesCS> LeerPorcentualesDesdeExcel(string arch, string Hoja)
        {
            List<CargaPorcentualesCantidadesCS> resultados = new List<CargaPorcentualesCantidadesCS>();

            DataTable dt = LectorExcelCS.SelectExcel(arch, Hoja);

            for (int i = 0; i < dt.Rows.Count - 1; i++)
            {
                DataRow item = dt.Rows[i];
                if (!item[0].ToString().Equals(""))
                {
                    CargaPorcentualesCantidadesCS porcentuales = new CargaPorcentualesCantidadesCS();
                    porcentuales.CodigoArticulo = item[0].ToString();
                    porcentuales.CantidadArticulos = (item[1].ToString().Equals("")) ? (short)0 : short.Parse(item[1].ToString());
                    porcentuales.ManoDeObra = (item[2].ToString().Equals("")) ? 0.0m : Convert.ToDecimal(item[2].ToString());
                    porcentuales.GastosFijos = (item[3].ToString().Equals("")) ? 0.0m : Convert.ToDecimal(item[3].ToString());
                    porcentuales.Rentabilidad = (item[4].ToString().Equals("")) ? 0.0m : Convert.ToDecimal(item[4].ToString());
                    porcentuales.Insumos = (item[5].ToString().Equals("")) ? 0.0m : Convert.ToDecimal(item[5].ToString());
                    porcentuales.Iva = (item[6].ToString().Equals("")) ? 0.0m : Convert.ToDecimal(item[6].ToString());

                    resultados.Add(porcentuales);
                }
                
            }

            resultados.RemoveAll(CodigosVaciosPorcentuales);

            return resultados;
        }

        private static bool CodigosVaciosPorcentuales(CargaPorcentualesCantidadesCS porcentuales)
        {
            return porcentuales.CodigoArticulo.Equals("");
        }

        public void CargarPorcentualesPorExcel()
        {
            List<CargaPorcentualesCantidadesCS> resultados = new List<CargaPorcentualesCantidadesCS>();
            int resultadoConsulta = 0;

            CargaPorcentualesCantidadesBD porcentualesDB = new CargaPorcentualesCantidadesBD();

            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Excel Files(*.xlsx;*.xls)|*.xlsx;*.xls";
            openFileDialog.Title = "Seleccione archivo de Excel";

            int height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
            int width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;

            if (openFileDialog.ShowDialog() == true)
            {
                string path = openFileDialog.FileName;
                string nombreHoja = Microsoft.VisualBasic.Interaction.InputBox("Ingrese el nombre de la Hoja de Excel que contiene la informacion", "Nombre Hoja", "Hoja1", width / 3, height / 3);

                if (!nombreHoja.Trim().Equals(""))
                {
                    resultados = LeerPorcentualesDesdeExcel(path, nombreHoja);
                    resultadoConsulta = porcentualesDB.CargarPorcentuales(resultados);

                    if (resultadoConsulta == 1)
                    {
                        MessageBox.Show("Datos Cargados");
                    }
                    else
                    {
                        MessageBox.Show("Hubo un error en la carga");
                    }
                }
                else
                {
                    MessageBox.Show("Nombre de Hoja no encontrado");
                }
            }
        }

        #endregion

        #region Cotizaciones

        /** arch: Ruta del archivo
         *  Hoja: Nombre de la hoja donde estan los datos en Excel
         **/

        private List<CotizarArticulosCS> LeerCotizacionesDesdeExcel(string arch, string Hoja)
        {
            List<CotizarArticulosCS> resultados = new List<CotizarArticulosCS>();

            DataTable dt = LectorExcelCS.SelectExcel(arch, Hoja);

            for (int i = 0; i < dt.Rows.Count - 1; i++)
            {
                DataRow item = dt.Rows[i];
                if (!item[0].ToString().Equals(""))
                {
                    CotizarArticulosCS cotizacion = new CotizarArticulosCS();
                    cotizacion.IdArticulo= item[0].ToString();
                    cotizacion.CantidadArticulos = (item[1].ToString().Equals("")) ? 0 : Convert.ToInt16(item[1].ToString());
                    cotizacion.IdRubro = item[2].ToString();
                    cotizacion.IdSubRubro = item[3].ToString();
                    cotizacion.Cantidad = (item[4].ToString().Equals("")) ? 0.0m : Convert.ToDecimal(item[4].ToString());
                    cotizacion.IdUnidad = item[5].ToString();

                    resultados.Add(cotizacion);
                }

            }

            resultados.RemoveAll(CodigosVaciosCotizaciones);

            return resultados;
        }

        private static bool CodigosVaciosCotizaciones(CotizarArticulosCS cotizacion)
        {
            return cotizacion.IdArticulo.Equals("");
        }

        public void CargarCotizacionesPorExcel()
        {
            List<CotizarArticulosCS> resultados = new List<CotizarArticulosCS>();
            int resultadoConsulta = 0;

            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Excel Files(*.xlsx;*.xls)|*.xlsx;*.xls";
            openFileDialog.Title = "Seleccione archivo de Excel";

            int height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
            int width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;

            CotizarArticulosDB cotizarDB = new CotizarArticulosDB();

            if (openFileDialog.ShowDialog() == true)
            {
                string path = openFileDialog.FileName;
                string nombreHoja = Microsoft.VisualBasic.Interaction.InputBox("Ingrese el nombre de la Hoja de Excel que contiene la informacion", "Nombre Hoja", "Hoja1", width / 3, height / 3);

                if (!nombreHoja.Trim().Equals(""))
                {
                    resultados = LeerCotizacionesDesdeExcel(path, nombreHoja);
                    resultadoConsulta = cotizarDB.CargarCotizaciones(resultados);

                    if (resultadoConsulta == 1)
                    {
                        MessageBox.Show("Datos Cargados");
                    }
                    else
                    {
                        MessageBox.Show("Hubo un error en la carga");
                    }
                }
                else
                {
                    MessageBox.Show("Nombre de Hoja no encontrado");
                }
            }
        }

        #endregion
    }
}
